#!/bin/bash

# 脚本名称：get_site_public_ip.sh
# 脚本功能：获取指定网站的公网 IP 地址，集成多种方法进行解析，并对比结果是否一致。
# 版本：1.0
# 作者：网络管理达人
# 日期：2025-03-22

# 脚本功能说明：
# 1. 本脚本用于获取指定网站的公网 IP 地址，采用多种方法进行获取和校验，确保获取的 IP 地址准确无误。
# 2. 支持的获取方法：
#    - 方法1：nslookup 命令
#    - 方法2：dig 命令
#    - 方法3：host 命令
#    - 方法4：ping 命令
# 3. 脚本提供一致性检查功能，对比不同方法返回的 IP 地址是否一致。
# 4. 使用彩色输出，让成功、失败和警告信息清晰可辨。
# 5. 提供帮助功能，通过 -h 或 --help 参数查看脚本使用方法。

# 颜色定义（便于彩色输出）
RED='\033[31m'    # 错误或失败信息
GREEN='\033[32m'  # 成功信息
YELLOW='\033[33m' # 警告或提示信息
RESET='\033[0m'   # 颜色重置

# 打印帮助信息
show_help() {
    echo -e "${GREEN}本脚本用于获取指定网站的公网 IP 地址。${RESET}"
    echo -e "${YELLOW}用法：${RESET} $0 [网站域名]"
    echo -e "${YELLOW}示例：${RESET} $0 www.google.com"
    echo -e "${YELLOW}支持的方法：${RESET}"
    echo -e "  1) nslookup  - 使用 DNS 查找工具获取 IP"
    echo -e "  2) dig       - 使用 DNS 查询工具获取 IP"
    echo -e "  3) host      - 使用 DNS 主机名查找工具获取 IP"
    echo -e "  4) ping      - 通过网络连接测试获取 IP"
    exit 0
}

# 参数校验：如果用户输入 -h 或 --help，则显示帮助信息
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
    show_help
fi

# 参数校验：如果未输入域名，则提示错误并显示帮助
if [ "$#" -ne 1 ]; then
    echo -e "${RED}错误：请提供一个网站域名作为参数。${RESET}"
    show_help
fi

# 方法1：使用 nslookup 获取公网 IP
get_ip_nslookup() {
    # 使用 nslookup 解析域名，提取 IP 地址
    nslookup "$1" 2>/dev/null | awk '/^Address: / {print $2}'
}

# 方法2：使用 dig 获取公网 IP
get_ip_dig() {
    # 使用 dig 命令进行 DNS 查询，提取纯 IP 地址
    dig +short "$1" 2>/dev/null | grep -E '^[0-9.]+$'
}

# 方法3：使用 host 获取公网 IP
get_ip_host() {
    # 使用 host 命令进行主机名解析，提取 IP 地址
    host "$1" 2>/dev/null | grep "has address" | awk '{print $4}'
}

# 方法4：使用 ping 获取公网 IP
get_ip_ping() {
    # 使用 ping 命令发送一次 ICMP 请求，提取响应中的 IP 地址
    ping -c 1 "$1" 2>/dev/null | head -n 1 | grep -oP '(?<=\().+?(?=\))' | head -n 1
}

# 主函数：使用多种方法获取 IP 并对比结果
main() {
    echo -e "${GREEN}正在获取网站 [$1] 的公网 IP 地址：${RESET}"

    # 使用不同方法获取 IP 地址
    ip_nslookup=$(get_ip_nslookup "$1")
    ip_dig=$(get_ip_dig "$1")
    ip_host=$(get_ip_host "$1")
    ip_ping=$(get_ip_ping "$1")

    # 显示各方法结果
    echo -e "${YELLOW}方法1：nslookup -> ${GREEN}$ip_nslookup${RESET}"
    echo -e "${YELLOW}方法2：dig      -> ${GREEN}$ip_dig${RESET}"
    echo -e "${YELLOW}方法3：host     -> ${GREEN}$ip_host${RESET}"
    echo -e "${YELLOW}方法4：ping     -> ${GREEN}$ip_ping${RESET}"

    # 收集所有非空 IP 地址
    results=("$ip_nslookup" "$ip_dig" "$ip_host" "$ip_ping")
    unique_ips=($(printf "%s\n" "${results[@]}" | grep -v '^$' | sort -u))

    # 一致性检查：判断所有方法返回的 IP 地址是否一致
    if [ ${#unique_ips[@]} -eq 0 ]; then
        echo -e "${RED}未能通过任何方法获取到 IP 地址，请检查域名是否正确。${RESET}"
    elif [ ${#unique_ips[@]} -eq 1 ]; then
        # 当所有方法结果一致时，显示唯一 IP
        echo -e "${GREEN}所有方法返回一致的 IP 地址：${unique_ips[0]}${RESET}"
    else
        # 当方法返回的 IP 不一致时，逐个显示不同的 IP
        echo -e "${RED}方法返回的 IP 地址不一致，请手动检查：${RESET}"
        for ip in "${unique_ips[@]}"; do
            echo -e "${YELLOW}- $ip${RESET}"
        done
    fi
}

# 运行主函数，传入用户指定的网站域名
main "$1"
